public class TabelaIgnorancia {
	
	private static TabelaIgnorancia instanceOfTabela;
	
	private TabelaIgnorancia() {
		vetorDeCodificados = new int[256];
		vetorDeDecodificados = new int[256];
		
		for (int i=0; i<256; i++) {
			vetorDeCodificados[i] = 0;
			vetorDeDecodificados[i] = 0;
		}
	}
	
	public static TabelaIgnorancia getInstance() {
		if(instanceOfTabela == null) {
			instanceOfTabela = new TabelaIgnorancia();
		}
		return instanceOfTabela;
	}
	

	public char descobreSimbolo(int valor) {
		if (valor < 0) {
			System.out.println("erro2");
		}
		int caracterReal = valor + vetorDeDecodificados[valor];
		return (char)caracterReal;
	}
	

	public int[] probSimbolo(char simbolo) {
		int[] dados = new int[3];
		int valorSimbolo = simbolo;
		
		dados[0] = valorSimbolo - vetorDeCodificados[valorSimbolo];
		dados[1] = valorSimbolo - vetorDeCodificados[valorSimbolo] + 1;
		dados[2] = TOTAL_DE_SIMBOLOS - this.totalCodificados;
			
		this.totalCodificados++;
		this.incrementaCodificados(valorSimbolo);
		
		return dados;
	}

	public int[] probSimboloDec(char simbolo) {
		int[] dados = new int[3];
		int valorSimbolo = simbolo;
		
		dados[0] = valorSimbolo - vetorDeDecodificados[valorSimbolo];
		dados[1] = valorSimbolo - vetorDeDecodificados[valorSimbolo] + 1;
		dados[2] = TOTAL_DE_SIMBOLOS - this.totalDecodificados;
			
		this.totalDecodificados++;
		this.incrementaDecodificados(valorSimbolo);
		
		return dados;
	}
	
	private void incrementaCodificados(int inicio) {
		for(int i = inicio; i < TOTAL_DE_SIMBOLOS; i++){
			vetorDeCodificados[i]++;
		}
	}
	
	private void incrementaDecodificados(int inicio) {	
		for(int i = inicio; i < TOTAL_DE_SIMBOLOS; i++){
			vetorDeDecodificados[i]++;
		}
	}
	
	
	public int getTotalSimbolosNaoDecodificados() {
		return 256 - totalDecodificados; 
	}
	
	private int totalCodificados = 0;
	private int totalDecodificados = 0;	
	private static int[] vetorDeCodificados;
	private static int[] vetorDeDecodificados;
	public static int TOTAL_DE_SIMBOLOS = 256;


}
